/*
*    Qizx/open 3.0 beta
*
* This code is the open-source version of Qizx.
* Copyright (C) 2004-2009 Axyana Software -- All rights reserved.
*
* The contents of this file are subject to the Mozilla Public License 
*  Version 1.1 (the "License"); you may not use this file except in 
*  compliance with the License. You may obtain a copy of the License at
*  http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
*  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
*  for the specific language governing rights and limitations under the
*  License.
*
* The Initial Developer of the Original Code is Xavier Franc - Axyana Software.
*
*/
using System;
using EvaluationException = System.Qizx.Api.EvaluationException;
using QName = System.Qizx.Api.QName;
using NamespaceContext = System.Qizx.Util.NamespaceContext;
using IQName = System.Qizx.Xdm.IQName;
using ModuleContext = System.Qizx.XQuery.ModuleContext;
using XQItemType = System.Qizx.XQuery.XQItemType;
using XQType = System.Qizx.XQuery.XQType;
using XQTypeException = System.Qizx.XQuery.XQTypeException;
using XQValue = System.Qizx.XQuery.XQValue;
namespace System.Qizx.XQuery.Dt {

    /// <summary> Root of all atomic types. Undocumented internal class.</summary>
    public class AtomicType : XQItemType {
        public override string ShortName {
            get {
                return "anyAtomicType";
            }
        }

        public override QName Name {
            get {
                return IQName.GetQName(NamespaceContext.XSD, ShortName);
            }

        }
        public AtomicType() {
        }

        // Tries to intern on deserialization
        public virtual System.Object readResolve() {
            XQType typ = XQType.findItemType(Name);
            return typ != null ? typ : this;
        }

#if XBRLFormula
        public override int quickCode() {
            return QT_UNTYPED;
        }
#endif

        public override bool promotable(XQItemType type) {
            return type == XQType.UNTYPED_ATOMIC;
        }

        protected internal virtual void castException(System.Exception e, string xqueryError) {
            EvaluationException ex = new EvaluationException("cannot cast to xs:" + ShortName + ": " + e.Message);
            ex.setErrorCode(ModuleContext.xqueryErrorCode(xqueryError));
            throw ex;
        }

        protected internal virtual XQValue invalidObject(System.Object objValue) {
            throw new XQTypeException("invalid value " + objValue + " for type " + this);
        }
    }
}